home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / tools / czesc_4 / startupselector1.2 / source / startupselector.e
Text File  |  1982-11-13  |  11KB  |  409 lines

  1. /*     Startup  Selector     */
  2. /*   by OLIVERES Jean-Marc   */
  3. /* (c) 1996 Moonchild  Prod. */
  4. /*          01.02.97         */
  5.  
  6. OPT REG=3
  7.  
  8. MODULE 'dos/dos','dos/dostags','intuition/intuition','intuition/screens',
  9.        'gadtools','libraries/gadtools','reqtools','libraries/reqtools',
  10.        'exec/nodes','exec/lists','amigalib/lists'
  11.  
  12. ENUM ER_NONE,ER_WIN,ER_DIR,ER_NODIR,ER_SCR,ER_MOUSE,ER_EXAM,ER_REQ,ER_GAD,
  13.          ER_FILE,ER_MEM
  14. ENUM WBS=1,USER,LVID,RMB,WBSP
  15.  
  16. RAISE ER_WIN   IF OpenWindowTagList()=NIL,
  17.             ER_SCR   IF LockPubScreen()=NIL,
  18.             ER_MOUSE IF Mouse()<>1,
  19.             ER_EXAM  IF Examine()=NIL,
  20.             ER_MEM   IF New()=NIL
  21.  
  22. CONST BIGGER=-1,SMALLER=1
  23.  
  24. DEF ptrwin=NIL:PTR TO window,glist=NIL
  25. DEF scr=NIL:PTR TO screen,visual,menu
  26. DEF lv_width,lv_heigth,fic_nbr=0,fic_lng=0
  27. DEF info:fileinfoblock,dirscan,dirlock
  28. DEF ch[70]:STRING,count1=0,count2=0,count3=0
  29. DEF choice1,choice2,choice3
  30. DEF list=NIL:PTR TO lh,node=NIL:PTR TO ln
  31. DEF f_hdl,nodename,wbsplus,wbsp_path
  32.  
  33. PROC main() HANDLE
  34.     DEF mes=NIL:PTR TO intuimessage
  35.     DEF id,gad=NIL:PTR TO gadget,i,userdata,idcmp,item
  36.     DEF seconds=0,micros,seconds2,micros2,sel
  37.     init()
  38.     choicerep()
  39.     nodename:=readlog()
  40.     Mouse()
  41.     scr:=LockPubScreen(NIL)
  42.     visual:=GetVisualInfoA(scr,NIL)
  43.     wbsp_path:='SYS:prefs/WBStartup+Prefs'
  44.     wbsplusprefs()
  45.     scanstartupdir()
  46.     addstartgadget()
  47.     window()
  48.     createmen()
  49.     REPEAT
  50.         IF mes:=Gt_GetIMsg(ptrwin.userport)
  51.             idcmp:=mes.class
  52.             SELECT idcmp
  53.             CASE IDCMP_MENUPICK
  54.                 IF (item:=ItemAddress(menu,mes.code))<>NIL
  55.                     id:=Long(item+34)
  56.                     IF id=1 THEN req('StartupSelector\n\nVersion 1.2\n\nCopyright © 1996-97\n\n'+
  57.                                                      '01.02.97\n\nMoonchild Prod.')
  58.                     IF id=2 THEN SystemTagList('NewCli',NIL)
  59.                     IF id=3
  60.                         IF ptrwin THEN CloseW(ptrwin)
  61.                         Gt_ReplyIMsg(mes)
  62.                         quit()
  63.                     ENDIF
  64.                 ENDIF
  65.             CASE IDCMP_GADGETUP
  66.                 gad:=mes.iaddress
  67.                 userdata:=gad.userdata
  68.                 SELECT userdata
  69.                 CASE USER
  70.                     count1:=Not(count1)
  71.                 CASE WBS
  72.                     count2:=Not(count2)
  73.                 CASE RMB
  74.                     count3:=Not(count3)
  75.                 CASE WBSP
  76.                     SystemTagList(wbsp_path,NIL)
  77.                 CASE LVID
  78.                     CurrentTime({seconds2},{micros2})
  79.                     node:=list.head
  80.                     FOR i:=1 TO mes.code DO node:=node.succ 
  81.                     IF seconds=0
  82.                         CurrentTime({seconds},{micros})
  83.                         sel:=i
  84.                     ELSEIF DoubleClick(seconds,micros,seconds2,micros2) AND (sel=i)
  85.                         setlog(node.name)
  86.                         Gt_ReplyIMsg(mes)
  87.                         launchstart(node.name)
  88.                     ELSE
  89.                         seconds:=0
  90.                         CurrentTime({seconds},{micros})
  91.                         sel:=i
  92.                     ENDIF
  93.                 ENDSELECT
  94.             ENDSELECT
  95.             Gt_ReplyIMsg(mes)
  96.         ELSE
  97.             WaitPort(ptrwin.userport)
  98.         ENDIF
  99.     UNTIL idcmp=IDCMP_CLOSEWINDOW
  100.     setlog(nodename)
  101.     launchstart(nodename)
  102. EXCEPT
  103.     SELECT exception
  104.         CASE ER_WIN          ;    req('Unable to open window !')
  105.         CASE ER_DIR          ;    req('Can''t find your directory !')
  106.         CASE ER_NODIR      ;    req('Not a directory !')
  107.         CASE ER_SCR          ;    req('Unable to lock Workbench screen !')
  108.         CASE ER_EXAM      ;    req('Can''t access directory or file !')
  109.         CASE ER_GAD     ; req('Can''t open the Gadtools.library !')
  110.         CASE ER_MEM     ; req('Not enough memory !')
  111.         CASE ER_MOUSE
  112.             IF count3
  113.                 launchstart(nodename)
  114.             ELSE
  115.                 StrCopy(ch,dirscan,ALL)
  116.                 AddPart(ch,'Startup-Sequence',70)
  117.                 IF (dirlock:=Lock(ch,ACCESS_READ))=NIL
  118.                     req('No Startup-Sequence !\nPress ''OK'' to load the Workbench')
  119.                     SystemTagList({lwb},NIL)    
  120.                     quit()
  121.                 ENDIF
  122.             ENDIF
  123.             launchstart('Startup-Sequence')
  124.     ENDSELECT
  125.     quit()
  126. ENDPROC
  127.  
  128. PROC setlog(nodename)
  129.     IF count3
  130.         IF count1 THEN choice1:='Y' ELSE choice1:='N'
  131.         IF count2 THEN choice2:='Y' ELSE choice2:='N'
  132.             writelog(choice1,choice2,'Y',nodename)
  133.         ELSE
  134.             writelog('N','N','N',nodename)
  135.         ENDIF
  136. ENDPROC
  137.  
  138. PROC init()
  139.     VOID '$VER:Startup Selector 1.2 (01.02.97) Moonchild Prod.'
  140.     AssignPath('ENV','RAM')
  141.     reqtoolsbase:=OpenLibrary('reqtools.library',37)
  142.     IF (gadtoolsbase:=OpenLibrary('gadtools.library',37))=NIL THEN Raise(ER_GAD)
  143.     Rename({wbsold},{wbs})
  144.     Rename({wbsoldinfo},{wbsinfo})
  145.     Rename({userold},{user})
  146. ENDPROC
  147.  
  148. PROC writelog(choice1,choice2,choice3,node)
  149.     f_hdl:=Open({sslog},NEWFILE)
  150.     Write(f_hdl,choice1,StrLen(choice1)+1)
  151.     Write(f_hdl,choice2,StrLen(choice2)+1)
  152.     Write(f_hdl,choice3,StrLen(choice3)+1)
  153.     Write(f_hdl,node,StrLen(node)+1)
  154.     Close(f_hdl)
  155. ENDPROC
  156.  
  157. PROC readlog()
  158.     DEF log,f_len
  159.     log:={sslog}
  160.     f_len:=FileLength(log)
  161.     IF f_hdl:=Open(log,OLDFILE)
  162.         choice1:=New(f_len)
  163.         Read(f_hdl,choice1,f_len)
  164.         choice2:=choice1+(StrLen(choice1)+1)
  165.         choice3:=choice1+(StrLen(choice1)+1)+(StrLen(choice2)+1)
  166.         nodename:=choice1+(StrLen(choice1)+1)+(StrLen(choice2)+1)+(StrLen(choice3)+1)
  167.         Close(f_hdl)
  168.         IF OstrCmp(choice1,'Y')=0
  169.             count1:=TRUE
  170.         ENDIF
  171.         IF OstrCmp(choice2,'Y')=0
  172.             count2:=TRUE
  173.         ENDIF
  174.         IF OstrCmp(choice3,'Y')=0
  175.             count3:=TRUE
  176.         ENDIF
  177.     ELSE
  178.         req('''S:startupselector_log'' not found !\nCreating default _log ...\n'+
  179.                 'And starting with it ...')
  180.         writelog('N','N','N','Startup-Sequence')
  181.     ENDIF
  182. ENDPROC nodename
  183.  
  184. PROC req(msg)
  185.     IF reqtoolsbase
  186.         RtEZRequestA(msg,'OK',0,0,[RTEZ_FLAGS ,EZREQF_CENTERTEXT,
  187.                                                             RT_REQPOS   ,REQPOS_CENTERSCR,
  188.                                                             NIL])
  189.     ELSE
  190.         EasyRequestArgs(NIL,[20,0,'Information...',msg,'OK'],0,NIL)
  191.     ENDIF
  192. ENDPROC
  193.  
  194. PROC choicerep()
  195.     DEF myargs:PTR TO LONG,rdargs
  196.      myargs:=[0]
  197.      rdargs:=ReadArgs('PATH/O',myargs,NIL)
  198.     IF myargs[]=0
  199.         dirscan:='S:start/'
  200.     ELSE
  201.         dirscan:=String(StrLen(myargs[0]))
  202.         StrCopy(dirscan,myargs[0])
  203.     ENDIF
  204.     IF rdargs THEN FreeArgs(rdargs)
  205. ENDPROC
  206.  
  207. PROC scanstartupdir()
  208.     IF (dirlock:=Lock(dirscan,ACCESS_READ))=NIL THEN Raise(ER_NODIR)
  209.     Examine(dirlock,info)
  210.     IF info.direntrytype <= 0 THEN Raise(ER_NODIR)
  211.         NEW list
  212.         newList(list)
  213.         WHILE ExNext(dirlock,info)
  214.             INC fic_nbr
  215.             getstartupname(info.filename)
  216.         ENDWHILE
  217.     IF fic_nbr=0 THEN nofile()
  218. ENDPROC
  219.  
  220. PROC nofile()
  221.     req('No script in the directory !\nPress ''OK'' to load the Workbench')
  222.     SystemTagList({lwb},NIL)    
  223.     quit()
  224. ENDPROC
  225.  
  226. PROC getstartupname(infofilename)
  227.     DEF fic_chaine,length
  228.     DEF fic_chaineUp[30]:STRING,fic_preUp[30]:STRING,fic_finUp[30]:STRING
  229.     DEF newnode:PTR TO ln
  230.  
  231.     length:=StrLen(infofilename)
  232.     fic_chaine:=String(length)
  233.     StrCopy(fic_chaine,infofilename)
  234.     IF length>fic_lng THEN fic_lng:=length
  235.  
  236.     NEW newnode
  237.     newnode.name:=fic_chaine
  238.  
  239.     StrCopy(fic_chaineUp,fic_chaine)
  240.     UpperStr(fic_chaineUp)
  241.     IF fic_nbr>1
  242.         StrCopy(fic_preUp,list.head.name)
  243.         UpperStr(fic_preUp)
  244.     ENDIF
  245.     IF fic_nbr>2
  246.         StrCopy(fic_finUp,list.tailpred.name)
  247.         UpperStr(fic_finUp)
  248.     ENDIF
  249.  
  250.     IF fic_nbr=1
  251.         AddHead(list,newnode)
  252.     ELSEIF OstrCmp(fic_preUp,fic_chaineUp)=BIGGER
  253.         AddHead(list,newnode)
  254.     ELSEIF OstrCmp(fic_finUp,fic_chaineUp)=SMALLER
  255.         AddTail(list,newnode)
  256.     ELSE
  257.         node:=list.head
  258.         WHILE (node:=node.succ)<>NIL
  259.             StrCopy(fic_finUp,node.name)
  260.             UpperStr(fic_finUp)
  261.             IF OstrCmp(fic_finUp,fic_chaineUp)=BIGGER
  262.                 Insert(list,newnode,node.pred)
  263.                 RETURN
  264.             ENDIF
  265.         ENDWHILE
  266.     ENDIF
  267. ENDPROC
  268.  
  269. PROC addstartgadget()
  270.     DEF gadget,wbspname,wbsplen
  271.     gadget:=CreateContext({glist})
  272.     wbspname:='Call WBStartup+ ?'
  273.     wbsplen:=StrLen(wbspname)*8+8
  274.     lv_width:=fic_lng*8+28
  275.     IF fic_nbr<8
  276.         lv_heigth:=8*8+4
  277.     ELSEIF fic_nbr>29
  278.         lv_heigth:=29*8+4
  279.     ELSE
  280.         lv_heigth:=fic_nbr*8+4
  281.     ENDIF
  282.     gadget:=CreateGadgetA(LISTVIEW_KIND,gadget,
  283.                     [0,0,lv_width,lv_heigth,0,0,0,0,visual,LVID]:newgadget,
  284.                     [GTLV_LABELS,list,GTLV_SELECTED,TRUE,NIL])
  285.     gadget:=CreateGadgetA(CHECKBOX_KIND,gadget,
  286.                     [lv_width+2,0,12,12,0,0,0,0,visual,USER]:newgadget,
  287.                     [GTCB_CHECKED,count1,NIL])
  288.     gadget:=CreateGadgetA(CHECKBOX_KIND,gadget,
  289.           [lv_width+2,12,12,12,0,0,0,0,visual,WBS]:newgadget,
  290.                     [GTCB_CHECKED,count2,NIL])
  291.     gadget:=CreateGadgetA(CHECKBOX_KIND,gadget,
  292.           [lv_width+2,24,12,12,0,0,0,0,visual,RMB]:newgadget,
  293.                     [GTCB_CHECKED,count3,NIL])
  294.     IF wbsplus
  295.         gadget:=CreateGadgetA(BUTTON_KIND,gadget,
  296.                         [((213-wbsplen)/2)+lv_width,lv_heigth-13,wbsplen,12,
  297.                         wbspname,0,0,0,visual,WBSP]:newgadget,NIL)
  298.     ENDIF
  299. ENDPROC
  300.  
  301. PROC window()
  302.     DEF widcmp,wflags,rport,beveltags
  303.     DEF w_width,w_left,w_top
  304.     DEF nodenamelen
  305.     nodenamelen:=StrLen(nodename)*8+8
  306.     w_width:=lv_width+213
  307.     w_left:=(scr.width-w_width)/2
  308.     w_top:=(scr.height-lv_heigth)/2
  309.     beveltags:=[GT_VISUALINFO,visual,GTBB_FRAMETYPE,BBFT_BUTTON,NIL]
  310.     widcmp:=IDCMP_CLOSEWINDOW OR IDCMP_GADGETUP OR IDCMP_MENUPICK OR LISTVIEWIDCMP
  311.     wflags:=WFLG_CLOSEGADGET+WFLG_DRAGBAR+WFLG_GIMMEZEROZERO+WFLG_NEWLOOKMENUS
  312.     ptrwin:=OpenWindowTagList(NIL,[WA_TITLE        ,'Startup-Selector 1.1',
  313.                                  WA_GADGETS      ,glist,
  314.                                  WA_LEFT         ,w_left,
  315.                                  WA_TOP          ,w_top,
  316.                                  WA_INNERWIDTH   ,w_width,
  317.                                  WA_INNERHEIGHT  ,lv_heigth,
  318.                                  WA_IDCMP        ,widcmp,
  319.                                  WA_FLAGS        ,wflags,
  320.                                                                  WA_AUTOADJUST   ,-1,
  321.                                  WA_ACTIVATE     ,-1,
  322.                                  NIL])
  323.     Gt_RefreshWindow(ptrwin,NIL)
  324.     SetStdRast(ptrwin.rport)
  325.     rport:=ptrwin.rport
  326.     SetAPen(rport,2)
  327.     TextF(lv_width+32,8,'Disable User-Startup ?')
  328.     TextF(lv_width+32,20,'Disable WBStartup ?')
  329.     TextF(lv_width+32,32,'Save settings ?')
  330.     DrawBevelBoxA(rport,lv_width+29,0,184,11,beveltags)
  331.     DrawBevelBoxA(rport,lv_width+29,12,160,11,beveltags)
  332.     DrawBevelBoxA(rport,lv_width+29,24,128,11,beveltags)
  333.     IF wbsplus
  334.         TextF((213-nodenamelen)/2+lv_width,(lv_heigth-13-35)/2+35,nodename)
  335.     ELSE
  336.         TextF((213-nodenamelen)/2+lv_width,(lv_heigth-35)/2+35,nodename)
  337.     ENDIF
  338. ENDPROC
  339.  
  340. PROC createmen()
  341.   menu:=CreateMenusA([1,0,'Projet',0,0,0,0,
  342.                       2,0,'About',0,0,0,1,
  343.                                             2,0,NM_BARLABEL,0,0,0,0,
  344.                                             2,0,'NewCli',0,0,0,2,
  345.                                             2,0,NM_BARLABEL,0,0,0,0,
  346.                                             2,0,'Quit',0,0,0,3,
  347.                       0,0,0,0,0,0,0]:newmenu,[GTMN_FRONTPEN,1,
  348.                                                                                             GTMN_NEWLOOKMENUS,TRUE,
  349.                                                                                             NIL])
  350.   LayoutMenusA(menu,visual,NIL)
  351.   SetMenuStrip(ptrwin,menu)
  352. ENDPROC
  353.  
  354. PROC launchstart(file)
  355.     DEF launch,ch2[108]:STRING
  356.     IF count1
  357.         IF (Rename({user},{userold}))=NIL
  358.             req('Can''t rename User-Startup !')
  359.             RETURN
  360.         ENDIF
  361.     ENDIF
  362.     IF count2
  363.         IF (Rename({wbs},{wbsold}))=NIL OR (Rename({wbsinfo},{wbsoldinfo}))=NIL
  364.             req('Can''t rename WBStartup or WBStartup.info !')
  365.         ENDIF
  366.     ENDIF
  367.     StrCopy(ch2,'C:EXECUTE ',ALL)
  368.     StrCopy(ch,dirscan,ALL)
  369.     AddPart(ch,file,70)
  370.     StringF(ch,'"\s"',ch)
  371.     StrAdd(ch2,ch,ALL)
  372.     StrCopy(ch,ch2,ALL)
  373.     IF scr THEN UnlockPubScreen(NIL,scr)
  374.     IF ptrwin THEN CloseW(ptrwin)
  375.     IF (launch:=SystemTagList(ch,NIL))=TRUE
  376.         req('Can''t execute this script !\nPlease try another one ...')
  377.         RETURN
  378.     ENDIF
  379.     quit()
  380. ENDPROC
  381.  
  382. PROC wbsplusprefs()
  383.     IF dirlock:=Lock(wbsp_path,ACCESS_READ)
  384.         wbsplus:=TRUE
  385.         UnLock(dirlock)
  386.     ENDIF    
  387. ENDPROC
  388.  
  389. PROC quit()
  390.     IF menu THEN FreeMenus(menu)
  391.     IF dirlock THEN UnLock(dirlock)
  392.     IF scr THEN UnlockPubScreen(NIL,scr)
  393.     IF ptrwin THEN ClearMenuStrip(ptrwin)
  394.     IF visual THEN FreeVisualInfo(visual)
  395.     IF gadtoolsbase THEN CloseLibrary(gadtoolsbase)
  396.     IF reqtoolsbase THEN CloseLibrary(reqtoolsbase)
  397.     OpenWorkBench()
  398.     CleanUp(0)
  399. ENDPROC
  400.  
  401. wbs: CHAR 'SYS:WBStartup',0
  402. wbsinfo: CHAR 'SYS:WBStartup.info',0
  403. wbsold: CHAR 'SYS:WBStartupOld',0
  404. wbsoldinfo: CHAR 'SYS:WBStartupOld.info',0
  405. user: CHAR 'S:User-Startup',0
  406. userold: CHAR 'S:User-StartupOld',0
  407. lwb: CHAR 'C:LoadWB',0
  408. sslog: CHAR 'S:startupselector_log',0
  409.